package com.yzy.fly.annotation;

import com.baomidou.mybatisplus.annotation.TableField;
import com.yzy.fly.kernel.model.FlyBasicModel;
import com.yzy.fly.kernel.model.ability.config.DefaultRoleChildrenConfiger;
import com.yzy.fly.kernel.model.ability.config.RoleChildrenConfiger;
import com.yzy.fly.kernel.model.ability.map.AbstractMapLoader;
import com.yzy.fly.kernel.service.FlyBasicService;
import org.springframework.core.annotation.AliasFor;

import java.lang.annotation.*;

//@Target：描述注解能够作用的位置，其中属性 ElementType取值：
//        * TYPE：可以作用于类上
//        * METHOD：可以作用于方法上
//        * FIELD：可以作用于成员变量上
//@Retention：描述注解被保留的阶段
//@Retention(RetentionPolicy.RUNTIME)：当前被描述的注解，会保留到class字节码文件中，并被JVM读取到
//@Documented：描述注解是否被抽取到api文档中
//@Inherited：描述注解是否被子类继承
@Target(value = ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@TableField(exist = false)
public @interface RoleChildren {
    Class<? extends FlyBasicModel> modelClass() default FlyBasicModel.class;

    Class<?> clazz() default RoleChildren.class;
    boolean lazy() default true;

    Class<? extends FlyBasicService> loaderBean() default FlyBasicService.class;
    boolean tree() default false;

    int seq() default 1;

    boolean map() default false;
    Class<? extends AbstractMapLoader> maploader() default AbstractMapLoader.class;

    Class<? extends RoleChildrenConfiger> config() default DefaultRoleChildrenConfiger.class;

    @AliasFor(
            annotation = TableField.class, attribute = "exist"
    )
    /**
     * 是否为数据库表字段
     * <p>
     * 默认 true 存在，false 不存在
     */
     boolean tableFieldExist() default false;

    /**
     * 是否为fly模型管理
     * <p>
     * 默认 true 存在，false 不存在
     */
    boolean exist() default true;

}
